#include "Agora.h"

using namespace AgoraClient;

#ifdef __cplusplus
extern "C" {
#endif

	void * AgoraFactory_CreateAgora()
	{
		return new Agora();
	}

	void AgoraFactory_DeleteAgora(void *agora)
	{
		try
		{
			delete reinterpret_cast<Agora*>(agora);
		}
		catch(...)
		{
			return; // ErrorManager = TODO
		}
	}

	int AgoraFactory_CreateDefaultMicrophone(void* agora, unsigned int frequence, unsigned int format)
	{
		if (frequence != 8000 && frequence != 16000 && frequence != 32000)
			return -1; // ErrorManager = TODO
		if (format < 1 || format > 4)
			return -1; // ErrorManager = TODO
		try
		{
			return reinterpret_cast<Agora*>(agora)->CreateDefaultMicro((FrequenceEnum)frequence, (ALFormat)format);
		}
		catch(...)
		{
			return -1; // ErrorManager = TODO
		}
	}

	void AgoraFactory_CreateDefaultEncoder(void *agora, unsigned int quality, char encoderKey)
	{
		if (quality > 10)
			quality = 10;
		else if (quality < 1)
			quality = 1;
		try
		{
			reinterpret_cast<Agora*>(agora)->CreateDefaultEncoder(quality, encoderKey);
		}
		catch(...)
		{
			return; // ErrorManager = TODO
		}
	}

	void AgoraFactory_CreateDefaultAudioOut(void *agora)
	{
		try
		{
			reinterpret_cast<Agora*>(agora)->CreateDefaultAudioOut();
		}
		catch(...)
		{
			return; // ErrorManager = TODO
		}
	}

	void AgoraFactory_CreateDefaultEmpacter(void *agora)
	{
		try
		{
			reinterpret_cast<Agora*>(agora)->CreateDefaultEmpacter();
		}
		catch(...)
		{
			return; // ErrorManager = TODO
		}
	}

	void AgoraFactory_CreateDefaultClient(void *agora)
	{
		try
		{
			reinterpret_cast<Agora*>(agora)->CreateDefaultClient();
		}
		catch(...)
		{
			return; // ErrorManager = TODO
		}
	}

	void AgoraFactory_RemoveAudioInput(void *agora, int audioInKey)
	{
		try
		{
			reinterpret_cast<Agora*>(agora)->RemoveAudioInput(audioInKey);
		}
		catch(...)
		{
			return; // ErrorManager = TODO
		}
	}

	void AgoraFactory_RemoveEncoder(void *agora, char encoderKey)
	{
		try
		{
			reinterpret_cast<Agora*>(agora)->RemoveEncoder(encoderKey);
		}
		catch(...)
		{
			return; // ErrorManager = TODO
		}
	}

#ifdef __cplusplus
}
#endif